import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from 'axios';

// 创建axios实例
const instance: AxiosInstance = axios.create({
  baseURL: 'http://ajax-api.itheima.net/api', // 替换为你的API基地址
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
instance.interceptors.request.use(
  async config => {
    // 在发送请求之前做些什么
    // 例如：添加token
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  },
);

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    const res = response.data;
    // 根据自己的业务逻辑处理响应
    return res.data;
  },
  error => {
    // 对响应错误做点什么
    if (error.response) {
      // 根据不同的HTTP状态码处理错误
      switch (error.response.status) {
        case 401:
          // 未授权，可能需要重新登录
          console.error('未授权，请重新登录');
          break;
        case 403:
          // 拒绝访问
          console.error('拒绝访问');
          break;
        case 404:
          // 请求的资源不存在
          console.error('请求的资源不存在');
          break;
        case 500:
          // 服务器错误
          console.error('服务器错误');
          break;
        default:
          console.error(`错误状态码: ${error.response.status}`);
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error('网络错误，未收到响应');
    } else {
      // 请求配置有误
      console.error('请求配置错误:', error.message);
    }
    return Promise.reject(error);
  },
);

// 封装GET请求
export const get = <Q = any, R = any>(
  url: string,
  params?: R,
  config?: AxiosRequestConfig,
) => {
  return instance.get<R, Q>(url, {params, ...config});
};

// 封装POST请求
export const post = <Q = any, R = any>(
  url: string,
  data?: R,
  config?: AxiosRequestConfig,
) => {
  return instance.post<R, Q>(url, data, config);
};

// 封装PUT请求
export const put = <Q = any, R = any>(
  url: string,
  data?: R,
  config?: AxiosRequestConfig,
) => {
  return instance.put<R, Q>(url, data, config);
};

// 封装DELETE请求
export const del = <Q = any, R = any>(
  url: string,
  config?: AxiosRequestConfig,
) => {
  return instance.delete<R, Q>(url, config);
};

export default instance;
